www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MeterZJ.cpp
// MeterZJ.cpp: implementation of the CMeterZJ class. // ////////////////////////////////////////////////////////////////////// #include "MeterZJ.h" #include "MPZJ.h" #include "MPTran.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMeterZJ::CMeterZJ() { pMPBase = new CMPTran(); } CMeterZJ::CMeterZJ( METERPARA meter) { pMPBase = new CMPTran(); memcpy(&m_meter,&meter,sizeof(METERPARA)); m_meter.com_para.addr[1] = m_meter.type ; } CMeterZJ::~CMeterZJ() { } int CMeterZJ::OnReadAllItems(int m_mask) { int i; // time_t m_time,m_time1; // time( &m_time ); if(m_mask & 0x01) { i = OnReadEnergy( ); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d电量数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d电量数据 ---- FALL!!!",m_meter.No); } #endif } if(m_mask & 0x02) { i = OnReadPVC(); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d瞬时量数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d瞬时量数据 ---- FALL!!!",m_meter.No); } #endif } if(m_mask & 0x04) { i = OnReadMD( ); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d需量数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d需量数据 ---- FALL!!!",m_meter.No); } #endif } if(m_mask & 0x08 == 0x08) { i = OnReadEvent(); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d电表事件数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d电表事件数据 ---- FALL!!!",m_meter.No); } #endif } // printf("\r\nmask:%02x",m_mask); if((m_mask & 0x10) == 0x10) { i = OnReadOther(); #ifdef DBUG_PRO if( i == 0) { printf("\r\n采集电表%d其他数据 ---- OK!!!",m_meter.No); } else { printf("\r\n采集电表%d其他数据 ---- FALL!!!",m_meter.No); } #endif } // printf("\r\n USED TIME %d",m_time1 - m_time); return 0; } int CMeterZJ::OnReadPVC() { BYTE err = 0; int Item[4] = {0xB63F,0xB64F,0xB61F,0xB62F}; for(int i = 0; i < 4 ;i++) { err <<= 1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } int CMeterZJ::OnReadEnergy( ) { BYTE err = 0; int Item[ 2 ] = {0x901F,0x902F};//对应浙江用电协议的类别 for(int i = 0; i < 2 ;i++) { err <<= 1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } int CMeterZJ::OnReadEvent() { BYTE err = 0; /* int Item[ 2 ] = {0x110,0x120};//对应浙江用电协议的类别 int Item_G[2] = {0x901F,0x902F}; for(int i = 0; i < 2 ;i++) { err <<= 1; if(!ReadItem( Item[i],RETRYNUM)) { err |= 0x01; } } */ return err; } int CMeterZJ::OnReadOther() { BYTE err = 0; int Item[ 1 ] = {0xC33F};//对应浙江用电协议的类别 for(int i = 0; i < 1 ;i++) { err <<= 1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } int CMeterZJ::OnReadMD( ) { BYTE err = 0; int Item[ 4 ] = {0xA01F,0xA02F,0xB01F,0xB02F};//对应浙江用电协议的类别 for(int i = 0; i < 4 ;i++) { err <<= 1; if(!ReadItem( Item[i], RETRYNUM)) { err |= 0x01; } } return err; } bool CMeterZJ:: ReadItem( int Item, int RetryCount) { bool Values = false; int FrmLen,RecvLen; BYTE tmp_buf[256]; FrmLen = pMPBase->FormReadDataFrame(OutFram, Item, m_meter.com_para.addr); if(FrmLen == 0) { printf("\r\n组织命令数据失败!!!!"); return Values; } int j = 0xFFFF, i; for(i = 0; i < RetryCount; i++) { if( !OnOpenCom() ) { continue;//串行口打开失败 } Write(OutFram,FrmLen); //发送帧 if ( !WaitForReponse(TIME_SEC) ) //等待回应帧 { OnCloseCom(); continue; } RecvLen = Read(tmp_buf,sizeof(tmp_buf) ); //读取帧 OnCloseCom(); DataLen = 0; j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,Item,DataFrame,DataLen,m_meter.com_para.addr); if ( j == 0)//解析帧 { if(DataLen > 0) pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,0,DataLen); else pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,1,DataLen); Values = true; return true; } } if( i >= RetryCount && j == 0xFFFF) { pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen); } return Values; } //bool CMeterGB::GetData(BYTE *data, int &dataLen, int item) //{ // //}